import java.util.*;

public class day2 {
    /**
     * 空调遥控
     * https://ac.nowcoder.com/acm/problem/229310
     */
    /**
     * 滑动窗口
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int p = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0;i < n;i++) {
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr); // 排序
        // [t-p,t+p]是区间的值，那么最大值也就是t+p，最小值就是t-p，那么t+p + t-p <= 2p
        // 所以不需要进行管理温度，只需要去查看 最大值-最小值是小于等于2p的即可
        int k = 2 * p;
        int left = 0,right = 0,ret = 0;
        while(right < n) {
            // 出窗口
            while(arr[right] - arr[left] > k) {
                // 判断是否出窗口
                left++;
            }
            // 更新结果 + 进窗口
            ret = Math.max(ret,right - left + 1);
            right++;
        }
        System.out.println(ret);
    }

    /**
     * 排序 + 二分
     */
    public static void main3(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int p = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0;i < n;i++) {
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr); // 排序
        int l = 0,r = 0; // 这个温度区间的 左端点和右端点 ，比如：p为2，K为3时候 -> (1,5)
        int left = 0,right = n - 1,mid = 0;
        int ret = 0;
        for(int k : arr) {
            left = 0;
            right = n - 1;
            while(left < right) {
                mid = (right - left) / 2 + left;
                if(arr[mid] < k - p) {
                    left = mid + 1;
                }else {
                    right = mid;
                }
            }
            l = left;

            left = 0;
            right = n - 1;
            while(left < right) {
                mid = (right - left + 1) / 2 + left;
                if(arr[mid] > k + p) {
                    right = mid - 1;
                }else {
                    left = mid;
                }
            }
            r = right;
            ret = Math.max(ret,r - l + 1);
        }
        System.out.println(ret);
    }


    /**
     * DP23 不相邻取数
     * https://www.nowcoder.com/practice/a2be806a0e5747a088670f5dc62cfa1e?tpId=230&tqId=39763&ru=/exam/oj
     */
    public static void main2(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] arr = new int[n + 1];
        for(int i = 1;i <= n;i++) {
            arr[i] = in.nextInt();
        }
        // 每一个位置的数据均存在 选或者不选 的情况
        int[] f = new int[n + 1]; // 选
        int[] g = new int[n + 1]; // 不选

        for(int i = 1;i <= n;i++) {
            f[i] = g[i - 1] + arr[i];
            g[i] = Math.max(f[i - 1],g[i - 1]);
        }

        System.out.println(Math.max(f[n],g[n]));
    }


    /**
     * 小红的ABC
     * https://ac.nowcoder.com/acm/problem/230720
     */
    public static void main1(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] str = in.next().toCharArray();
        int n = str.length;
        // 因为寻找最小的长度的，所以只需要查找 2 或者 3 的长度的即可
        int ret = -1;
        for(int i = 0;i < n;i++) {
            if(i + 1 < n && str[i] == str[i + 1]) {
                // 2就是最小的长度了，所以可以直接跳出
                ret = 2;
                break;
            }
            if(i + 2 < n && str[i] == str[i + 2]) {
                ret = 3;
            }
        }
        System.out.println(ret);
    }
}
